const router = require('koa-router')()
const DB = require('../db/index');
const md5 = require('blueimp-md5');
const getDate = require('../utils/getDate');
const toDate = require('../utils/toDate');
const remove_arr_item = require('../utils/remove_arr_item');

router.prefix('/api');

// router.get('/', async (ctx, next) => {
//   await ctx.render('index', {
//     title: 'Hello Koa 2!'
//   })
// })
router.get('/', async (ctx) => {
  ctx.body = 'hello world';
})

router.get('/test', async (ctx) => {
  const result = await DB.find('users', {});
  ctx.body = result;
})

/**注册 */
router.post('/register', async (ctx) => {
  const _body = ctx.request.body; // 获取post提交来的数据
  const {username, password} = _body.values;
  const find_result = await DB.find('users', {username});
  if(find_result.length > 0) { // 先看下用户名是否被占用 若已被占用
    ctx.body = {
      TagCode: '00000001',
      TagMsg: 'this username has been used, please try again'
    }
  } else { // 未被占用
    const register_data = { // 注册成功后要添加的数据
      username,
      password: md5(password),
      task: []
    };
    await DB.add('users', register_data); // 把数据添加到数据库
    ctx.body = {
      TagCode: '00000000',
      TagMsg: 'register success'
    }
  }
})

/**登陆 */
router.post('/login', async (ctx) => {
  const _body = ctx.request.body.values;
  const {username, password} = _body;
  const find_result = await DB.find('users', {username, password: md5(password)});
  if(find_result.length > 0) { // 验证账号密码是否正确 若正确
    const {_id} = find_result[0];
    ctx.cookies.set('userId', _id, {
      maxAge: 1000*60*60*24,
      httpOnly: false
    });
    ctx.body = {
      TagCode: '00000000',
      TagMsg: 'login success'
    }
  } else { // 若不正确
    ctx.body = {
      TagCode: '00000001',
      TagMsg: 'username or password is false'
    }
  }
})

/**添加新任务 */
router.post('/add_new_task', async (ctx) => {
  let userId = ctx.cookies.get('userId'); // 获取cookie携带的userId
  if(!userId) {
    ctx.body = {
      TagCode: '00000001',
      data: false,
      TagMsg: 'please to Login before input here'
    }
    return;
  }
  const _body = ctx.request.body.value;
  const value = _body.inputValue; // 获取新增任务的值
  if(!value || value.trim().length === 0) { // 不允许输入空值
    ctx.body = {
      TagCode: '00000002',
      data: false,
      TagMsg: 'The new task that you add is not allowed null value'
    }
    return;
  }
  let day = new Date(getDate()).getTime();

  // 先看date是否添加过日期 如果没有 就写入日期 如果有就判断日期是否一致
  const date_find_result = await DB.find('users', {_id: DB.getObjectId(userId), 'task.date': day});
  if(date_find_result.length > 0) { // 存在
    // 确定下标 当前日期所在的对象，在task数组里的下标
    let dateArr = [];
    for(let i = 0; i < date_find_result[0].task.length; i++) {
      dateArr.push(date_find_result[0].task[i].date); // 把所有日期都放到日期数组
    }
    let _index = dateArr.indexOf(day);
    let old_newTask = date_find_result[0].task[_index].newTask; // newTask数组中原有的数据
    let new_newTask = old_newTask.concat([value]); // 把新增的数据拼接到newTask中
    // 更新数据库中newTask的值
    await DB.update_$_data('users', {_id: DB.getObjectId(userId), 'task.newTask': old_newTask}, {'task.$.newTask' : new_newTask});
  } else { // 不存在
    let new_data = {
      date: day,
      newTask: [],
      onGoing: [],
      finished: [],
      abandoned: []
    };
    // 先把日期和其他空数据放进数据库
    await DB.update_new_task('users', {_id: DB.getObjectId(userId)}, new_data);
    // 再把任务值加进数据库
    await DB.update_$_data('users', {_id: DB.getObjectId(userId), 'task.date': day}, {'task.$.newTask': [value]});
  }

  ctx.body = {
    TagCode: '00000000',
    TagMsg: 'success',
    data: true
  };
})

/**获取按照日期排序的任务列表 */
router.get('/tasklist_date', async (ctx) => {
  const userId = ctx.cookies.get('userId'); // 获取cookie携带的userId
  if(!userId) {
    ctx.body = {
      TagCode: '00000001',
      TagMsg: 'please to Login before click'
    }
    return;
  }
  const result = await DB.find('users', {_id: DB.getObjectId(userId)});
  if(result[0].task.length > 0){
    let list = [];
    for(let i = 0; i < result[0].task.length; i++) {
      list.push(result[0].task[i].date)
    }
    list.sort((a, b) => b - a);
    let listArr = list.map(key => toDate(key));
    ctx.body = {
      TagCode: '00000000',
      TagMsg: 'success',
      data: listArr
    }
  } else {
    ctx.body = {
      TagCode: '00000002',
      TagMsg: 'no data'
    }
  }
})

/**获取某个日期的任务情况 */
router.get('/tasklist_day', async (ctx) => {
  const userId = ctx.cookies.get('userId'); // 获取cookie携带的userId
  let day = ctx.request.query && ctx.request.query.day ? ctx.request.query.day : new Date().getTime();
  const result = await DB.find('users', {_id: DB.getObjectId(userId)});
  let list = []; // 存放时间戳
  for(let i = 0; i < result[0].task.length; i++) {
    list.push(result[0].task[i].date)
  }
  // list.sort((a, b) => b - a); // 不需要排序了,要和数据库里顺序保持一致
  let _index; // 前端传过来的时间戳 对应在数据库时间列表中的下标
  for(let i = 0; i < list.length; i++) {
    if(day == list[i]) {
      _index = i;
      break; // 满足条件就跳出循环，执行循环外面的代码。 这里不能用return，不然后续的所有代码都没机会执行了
    }
    if(day - list[i] < 1000*60*60*24) {
      _index = i;
      break;
    }
  }
  ctx.body = {
    TagCode: '00000000',
    TagMsg: 'success',
    data: _index != undefined ? result[0].task[_index] : [],
    // time: day,  // 获取任务时的日期时间戳
  }
})

// 获取某个用户的所有任务
router.get('/single_user_all_task', async (ctx) => {
  const userId = ctx.cookies.get('userId'); // 获取cookie携带的userId
  if(!userId) {
    ctx.body = {
      TagCode: '00000001',
      TagMsg: 'please login before get your tasks',
      data: false,
    }
  }
  const result = await DB.find('users', {_id: DB.getObjectId(userId)});
  ctx.body = {
    TagCode: '00000000',
    TagMsg: 'success',
    data: result[0].task.reverse(),
  }
})

// 修改单条任务状态
/**
 * 需要的参数：
 * day 任务所在的日期时间戳
 * task_state1 修改前的任务状态
 * task_state2 修改后的任务状态
 * task_index 修改前的下标
 */
router.post('/change_task_state', async (ctx) => {
  const userId = ctx.cookies.get('userId'); // 获取cookie携带的userId
  if(!userId) {
    ctx.body = {
      TagCode: '00000001',
      TagMsg: 'please login before move item! ',
      data: false,
    }
  }
  const {day, task_state1, task_state2, task_index} = ctx.request.body;
  let task_af1; // task_state1修改后
  let task_af2; // task_state2修改后
  // 查找到当日的所有类型的任务
  const result = await DB.find('users', {_id: DB.getObjectId(userId)});
  // 获取含有day的对象
  let task_day_obj;
  result[0].task.forEach((item, index) => {
    if(item.date === day) {
      task_day_obj = item;
      return;
    }
  })
  let task_item = task_day_obj[task_state1][task_index]; // 被改变的内容
  task_af1 = remove_arr_item(task_day_obj[task_state1], task_item);
  task_day_obj[task_state2].push(task_item);
  task_af2 = task_day_obj[task_state2];
  let task_str1 = 'task.$.' + task_state1;
  let task_str2 = 'task.$.' + task_state2;
  await DB.update_$_data('users', {_id: DB.getObjectId(userId), 'task.date': day}, {[task_str1]: task_af1, [task_str2]: task_af2});
  ctx.body = {
    TagCode: '00000000',
    TagMsg: 'success',
    data: true,
  }
})

module.exports = router;
